package middleware

import (
	"common/pkg"
	"github.com/gin-gonic/gin"
	uuid "github.com/satori/go.uuid"
	"log"
	"net/http"
	"strings"
	"time"
)

// WhiteList 白名单路径
func WhiteList(path string) bool {
	WhitePathList := [...]string{
		"/api/demo/health",
		"/api/demo/args",
		"/api/demo/form",
		"/api/demo/map",
		"/api/demo/map2",
		"/api/demo/file",
		"/api/demo/mongo",
		"/api/demo/redis",
		"/api/demo/paas",
	}

	for i := 0; i < len(WhitePathList); i++ {
		if strings.Contains(path, WhitePathList[i]) {
			return true
		}
	}
	return false
}

// AuthenticationMiddleware 全局认证的中间件
func AuthenticationMiddleware(ctx *gin.Context) {
	var CacheClient = pkg.NewCacheClient()

	//增加链路id
	ctx.Request.Header.Add("traceId", uuid.NewV4().String())

	// 在header中增加用户信息
	var token = ctx.Request.Header.Get("Authorization")

	//如果访问没有携带token
	if len(token) == 0 {
		ctx.Request.Header.Add("userData", "")
	} else {

		//携带token 缓存中获取用户信息
		UserLoginInfo, _ := CacheClient.Get(token)

		// 如果缓存中没有用户信息，设置为空字符串
		if len(UserLoginInfo) == 0 {
			ctx.Request.Header.Add("userData", "")
		} else {
			// 缓存中存在用户信息，设置到header中
			ctx.Request.Header.Add("userData", UserLoginInfo)

			//token续期
			if err := CacheClient.SetExpiration(token, 30*time.Minute); err != nil {
				log.Fatalf("token续期失败: %v", err)
			}
		}
	}

	//检查是否白名单访问路径, 如果不是白名单, 则检查用户信息是否存在
	if !WhiteList(ctx.Request.RequestURI) {
		userData := ctx.Request.Header.Get("userData")
		if len(userData) == 0 {

			ctx.AbortWithStatus(http.StatusUnauthorized)
		}
	}

	// 继续处理请求
	ctx.Next()
}
